use std::collections::HashMap;

// 计算第 n 个斐波那契数并进行记忆化
fn fib(n: u32, memo: &mut HashMap<u32, u32>) -> u32 {
    if n == 0 {
        return 0;
    }
    if n == 1 {
        return 1;
    }
    if let Some(&value) = memo.get(&n) {
        return value;
    }
    let result = fib(n - 1, memo) + fib(n - 2, memo);
    memo.insert(n, result);  // 进行记忆化
    result
}

pub fn odd_fibnacci_sum(threshold: u32) -> u32 {
    let mut memo = HashMap::new();
    let mut i = 1;
    let mut cur_value = 1;
    let mut sum = 0;
    while cur_value < threshold { // 反复计算下一个斐波那契数，直到超过阈值
        if cur_value % 2 == 1 {
            sum += cur_value;
        }
        i += 1;
        cur_value = fib(i, &mut memo);
    }
    sum
}
